/******************************************************************************
 *
 *	Fichier:		Game.cpp
 *
 *	Function:		Voir .h	
 *
 *	Auteur:			Tristan Stérin
 *
 *	Copyright:		Copyright (c) 2010 <whomever>
 *						Tous droits réservés
 *	Notes:			
 *
 *
 *	
 *****************************************************************************/

#include "Game.h"
#include "global.h"

Game *game = new Game();//Définition de l'objet pour global.h

/***********
Constructeur
************/

Game::Game()
{
	OutLog->addLog("Démarrage de l'application\n");
	OutLog->addLog("Creation du système de Log II (messages d'erreurs)");//On ne peut le mettre dans error log, car ce n'est pas une erreur
	
	m_run = true;
		
	m_ecranGeneral = NULL;
	m_ecranDeBlit = NULL;
	m_ecranAffiche = NULL;
}

/************************************
Initialisation générale (libs etc...)
************************************/

bool Game::init()
{
	OutLog->addLog("Initialisation du jeu");
	//Initialisation de la SDL en mode vidéo
	if(SDL_Init(SDL_INIT_VIDEO) == -1)
	{
		ErrorLog->addLog(SDL_GetError());
		return false;
	}
	
	//Si la configuration fullscreen est désactivée
	if(!isFullscreen())
	{
		//On créé l'écran général
		m_ecranGeneral = SDL_SetVideoMode(ZeldaCommon::LARGEUR, ZeldaCommon::HAUTEUR, 32, SDL_HWSURFACE);
		
		//Si il n'a pas été créé
		if(m_ecranGeneral == NULL)
		{
			ErrorLog->addLog(SDL_GetError());
			return false;
		}
		
		//On créé l'écran de blit
		m_ecranDeBlit = SDL_CreateRGBSurface(SDL_HWSURFACE, 320, 240, 32, 0, 0, 0, 0);
		
		if(m_ecranDeBlit == NULL)
		{
			ErrorLog->addLog(SDL_GetError());
			return false;	
		}
	}	
	
	//On définit le titre
	SDL_WM_SetCaption("Zelda Project", NULL);
	
	//On autorise la non répétition de touche 
	SDL_EnableKeyRepeat(150, 150);
	
	return true;
	
}

/************************************
Boucle principale (coeur du programme)
************************************/

void Game::mainLoop()
{
	//Si l'initialisation a raté
	if(!init())
		setIsNotAnymoreRunning();
	
	SDL_Event evenement; //Event principal
	
	SDL_Rect src, dst;
	src.w=640; 
	src.h=480; 
	src.y=0;
	src.x=0;
	dst.x=0; 
	dst.y=0;
  
  	SDL_Surface *image = IMG_Load("1.png");
	
	if(!image)
	{
		ErrorLog->addLog("Impossible de charger l'image 1.png");
		setIsNotAnymoreRunning();
	}
	OutLog->addLog("Lancement du jeu");
	DebugLog->addLog("Essai, c'est un débug");
	
	audio->jouerSon(getPath(PATH::SON, "accelere.ogg"));
	audio->jouerMusique(getPath(PATH::SON, "Agahnim.mid"));
		
	while(isRunning())
	{
		//On écoute les événements
		SDL_WaitEvent(&evenement);
		
		//On le(s) traite
		manageEvent(evenement);
		
		//On remplit l'écran principal avec notre couleur verte
		SDL_FillRect(m_ecranGeneral, NULL, SDL_MapRGB(m_ecranGeneral->format, ZeldaCommon::VERT.R, ZeldaCommon::VERT.G, ZeldaCommon::VERT.B)); 
		
		SDL_BlitSurface(image, NULL, m_ecranDeBlit, &dst);
		m_ecranAffiche = zoomSurface(m_ecranDeBlit, 2, 2, 0);
		SDL_BlitSurface(m_ecranAffiche, &src, m_ecranGeneral, &dst);
		
		//On actualise notre écran
		SDL_Flip(m_ecranGeneral);
		
	}
	
	audio->stopSon();
	audio->stopMusique();
	
	delete audio;
	delete OutLog;
	delete ErrorLog;
	delete DebugLog;
}

/************************************
Gestion des événements
@evenement : événement à traiter
************************************/

void Game::manageEvent(SDL_Event evenement)
{	
	//Selon le type d'événement
	switch(evenement.type)
	{
		//Si l'on quitte
		case SDL_QUIT:
			setIsNotAnymoreRunning();//On arrête le programme (en fait, la mainLoop)
		break;
	}
}

/************************************
Stop la boucle principale
*************************************/

void Game::setIsNotAnymoreRunning()
{
	m_run = false;
}

/************************************
Destructeur
*************************************/

Game::~Game()
{
	SDL_FreeSurface(m_ecranDeBlit);//On désaloue la surface de blit
	SDL_FreeSurface(m_ecranAffiche);//On désaloue la surface qui affiche
	
	SDL_Quit();//On quitte la SDL
	
}